package org.sysdance.aplicativo.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;

import org.sysdance.aplicativo.entidade.Funcionario;
import org.sysdance.aplicativo.excecao.ConexaoException;
import org.sysdance.aplicativo.excecao.DAOException;
import org.sysdance.aplicativo.integracao.FuncionarioIntegracao;
import org.sysdance.aplicativo.util.ConexaoUtil;
import org.sysdance.aplicativo.util.ResultSetUtil;
import org.sysdance.aplicativo.util.SysDanceUtil;

public class FuncionarioDAO implements FuncionarioIntegracao{

    @Override
    public Collection<Funcionario> consultarFuncionariosSemUsuario() {
        final StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM funcionario ");
        sql.append("WHERE id_usuario is null;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            final ResultSet rs = ps.executeQuery();
            final Collection<Funcionario> resultado = new LinkedList<Funcionario>();
            while(rs.next()){
                final Funcionario funcionario = new Funcionario();
                funcionario.setIdFuncionario(rs.getInt("id_funcionario"));
                funcionario.setNmFuncionario(rs.getString("nm_funcionario"));
                resultado.add(funcionario);
            }
            return resultado;
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return new LinkedList<Funcionario>();
    }

    @Override
    public void vincularFuncionarioUsuario(Integer idFuncionario, Integer idUsuario) {
        final StringBuilder sql = new StringBuilder();
        sql.append("UPDATE funcionario SET id_usuario=? ");
        sql.append("WHERE id_funcionario=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, idUsuario);
            ps.setInt(2, idFuncionario);
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
    }
    
    @Override
    public void inserirFuncionario(Funcionario funcionario) {
    	final StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO funcionario (id_funcionario, id_cidade, cargo_funcionario, nm_funcionario,");
        sql.append("cpf_funcionario, dt_nascimento_funcionario, sexo_funcionario,");
        sql.append("logradouro_funcionario, numero_endereco_funcionario, bairro_endereco_funcionario) ");
        sql.append("VALUES (NEXTVAL('funcionario_id_funcionario_seq'), ?, ?, ?,?, ?, ?, ?, ?, ?);");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, funcionario.getCidade().getIdCidade());
            ps.setString(2, funcionario.getCargoFuncionario());
            ps.setString(3, funcionario.getNmFuncionario());
            ps.setString(4, funcionario.getCpfFuncionario());
            ps.setDate(5, new Date(funcionario.getDtNascimentoFuncionario().getTime()));
            ps.setInt(6, funcionario.getSexoFuncionario().getValor());
            ps.setString(7, funcionario.getLogradouroFuncionario());
            ps.setString(8,funcionario.getNumeroEnderecoFuncionario());
            ps.setString(9, funcionario.getBairroEnderecoFuncionario());
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
    }
    
    @Override
    public Collection<Funcionario> consultarTodosFuncionarios() {
    	 final StringBuilder sql = new StringBuilder();
         sql.append("SELECT * FROM funcionario;");
         try {
             final Connection conexao = ConexaoUtil.criarNovaConexao();
             final PreparedStatement ps = conexao.prepareStatement(sql.toString());
             return ResultSetUtil.extrair(ps.executeQuery(), Funcionario.class);
         } catch (final ConexaoException ex) {
             SysDanceUtil.getInstancia().imprimirLog(ex);
         } catch (final SQLException sqlex) {
             SysDanceUtil.getInstancia().imprimirLog(sqlex);
         }finally{
         	try {
 				ConexaoUtil.fecharConexao();
 			} catch (ConexaoException e) {
 				SysDanceUtil.getInstancia().imprimirLog(e);
 			}
         }
         return new LinkedList<Funcionario>();
    }
    
    @Override
    public Boolean isExisteCPFCadastrado(String cpfFuncionario){
    	final StringBuilder sql = new StringBuilder();
        sql.append("SELECT cpf_funcionario FROM funcionario where cpf_funcionario=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setString(1, cpfFuncionario);
            return ps.executeQuery().next();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return Boolean.FALSE;
    }
    
    @Override
    public void alterarDadosFuncionario(Funcionario funcionario) throws DAOException{
    	final StringBuilder sql = new StringBuilder();
        sql.append("UPDATE funcionario SET id_cidade=?, cargo_funcionario=?,");
        sql.append("nm_funcionario=?, cpf_funcionario=?, dt_nascimento_funcionario=?,");
        sql.append("sexo_funcionario=?, logradouro_funcionario=?, numero_endereco_funcionario=?,");
        sql.append("bairro_endereco_funcionario=? ");
        sql.append("WHERE id_funcionario=?;");
        
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, funcionario.getCidade().getIdCidade());
            ps.setString(2, funcionario.getCargoFuncionario());
            ps.setString(3, funcionario.getNmFuncionario());
            ps.setString(4, funcionario.getCpfFuncionario());
            ps.setDate(5, new Date(funcionario.getDtNascimentoFuncionario().getTime()));
            ps.setInt(6, funcionario.getSexoFuncionario().getValor());
            ps.setString(7, funcionario.getLogradouroFuncionario());
            ps.setString(8, funcionario.getNumeroEnderecoFuncionario());
            ps.setString(9, funcionario.getBairroEnderecoFuncionario());
            ps.setInt(10, funcionario.getIdFuncionario());
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
    }
    
}
